package pl.eskape.nawigacjapwr;

import java.util.ArrayList;

import android.R.interpolator;
import android.app.Activity;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import android.view.View;
import android.view.animation.Animation;
import android.view.animation.BounceInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


public class A_WyborWydzialu extends Activity {

    final String DEBUG_TAG = "aktywnosc2";


    //zmienne od animacji
    private Animation animacjaPrzesuniecieWDol;     // animacja rozuniecia
    private Animation animacjaPrzesuniecieWGore;    // animacja zasuniecia

    private boolean   rozsuniety;                   // pokazuje czy menu jest rozsuniete czy nie
    private LinearLayout.LayoutParams llparams;
    boolean czyWolnoKlikac;
    int iloscMiejsc;

    //zmienne od opóźnienia animacji
    private Message wiadomosc;
    private Handler handler;


    //zmienne od części layoutu
    private ArrayList<LinearLayout> przyciski;
    private ListView                obecnieOgladanaZawartosc;
    private int                     aktualnieKlikniety;
    private int                     poprzednioKlikniety;

    //
    private DbAdapter dbAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wybor_wydzialu);

        //tworzymy liste przyciskow
        przyciski = new ArrayList<LinearLayout>();
            przyciski.add((LinearLayout) findViewById(R.id.ll_przycisk1));
            przyciski.add((LinearLayout) findViewById(R.id.ll_przycisk2));
            przyciski.add((LinearLayout) findViewById(R.id.ll_przycisk3));
            przyciski.add((LinearLayout) findViewById(R.id.ll_przycisk4));
            przyciski.add((LinearLayout) findViewById(R.id.ll_przycisk5));
            przyciski.add((LinearLayout) findViewById(R.id.ll_przycisk6));
            przyciski.add((LinearLayout) findViewById(R.id.ll_przycisk7));
            przyciski.add((LinearLayout) findViewById(R.id.ll_przycisk8));
            przyciski.add((LinearLayout) findViewById(R.id.ll_przycisk9));
            przyciski.add((LinearLayout) findViewById(R.id.ll_przycisk10));
            przyciski.add((LinearLayout) findViewById(R.id.ll_przycisk11));
            przyciski.add((LinearLayout) findViewById(R.id.ll_przycisk12));


        dostosujFonty();


        //inicjacja zmiennych aby nie było przypadkowych wartosci
        dbAdapter = new DbAdapter(this);
        aktualnieKlikniety = poprzednioKlikniety = -1;
        rozsuniety = false;
        czyWolnoKlikac = true;

        Log.d(DEBUG_TAG, "Aktualnie jest przycisków:" + przyciski.size());

       //przypisujemy Listenery do przycisków
        for(int i=0; i<przyciski.size()-1; i++)
            przyciski.get(i).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(czyWolnoKlikac){
                        poprzednioKlikniety = aktualnieKlikniety;
                        aktualnieKlikniety = przyciski.indexOf(v);
                        if (rozsuniety == false) {
                            pokazZawartosc(przyciski.get(aktualnieKlikniety), aktualnieKlikniety);
                            tworzAnimacje((int)(iloscMiejsc * getResources().getDimension(R.dimen.wielkosc_pola_listView_w_rozwijanym_menu)), 1000);
                            rozsunMenu(aktualnieKlikniety);

                        }else{
                            zasunMenu(poprzednioKlikniety);

                            if (poprzednioKlikniety != aktualnieKlikniety) {
                                tworzAnimacje((int)(iloscMiejsc * getResources().getDimension(R.dimen.wielkosc_pola_listView_w_rozwijanym_menu)), 1000);
                                rozsunPonownieMenu(aktualnieKlikniety);
                            }else
                                rozsuniety = false;
                        }
                    }
                }
            });


        handler = new Handler() {

            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if(msg.arg1==1){
                    pokazZawartosc(przyciski.get(aktualnieKlikniety), aktualnieKlikniety);
                    tworzAnimacje((int)(iloscMiejsc * getResources().getDimension(R.dimen.wielkosc_pola_listView_w_rozwijanym_menu)), 1000);
                    rozsunMenu(aktualnieKlikniety);

                }
            }
        };
    }

    private void ukryjZawartosc(LinearLayout ll){
        ll.removeView(obecnieOgladanaZawartosc);
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) ll.getLayoutParams();
        params.height = (int)getResources().getDimension(R.dimen.wielkosc_pojedynczego_przycisku_w_rozwijanym_menu);
        ll.setLayoutParams(params);
        LinearLayout ll2 = przyciski.get(przyciski.indexOf(ll)+1);
        params = (LinearLayout.LayoutParams) ll2.getLayoutParams();
        params.topMargin = params.topMargin + (int)(iloscMiejsc * getResources().getDimension(R.dimen.wielkosc_pola_listView_w_rozwijanym_menu));
        ll2.setLayoutParams(params);
    }

    private void pokazZawartosc(LinearLayout ll, int ktoryZostalKlikniety){
        obecnieOgladanaZawartosc = new ListView(this);
        dbAdapter.open();
        ArrayList<Miejsce> miejsca = dbAdapter.pobierzMiejscaDlaWydzialu(aktualnieKlikniety+1);
        iloscMiejsc = miejsca.size();
        Toast.makeText(this,"Dla tego wydziału mamy w bazie " +iloscMiejsc + " miejsc", Toast.LENGTH_SHORT ).show();
        if(iloscMiejsc==0) rozsuniety=false;
        else{
        Adapter_ListViewZMiejscami adapter_listy = new Adapter_ListViewZMiejscami(this, miejsca);
        dbAdapter.close();
        obecnieOgladanaZawartosc.setAdapter(adapter_listy);
        obecnieOgladanaZawartosc.setVisibility(View.VISIBLE);
        ll.addView(obecnieOgladanaZawartosc);
         LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) ll.getLayoutParams();
        params.height = params.height+ (int)(iloscMiejsc * getResources().getDimension(R.dimen.wielkosc_pola_listView_w_rozwijanym_menu));
        ll.setLayoutParams(params);
        LinearLayout ll2 = przyciski.get(przyciski.indexOf(ll)+1);
        params = (LinearLayout.LayoutParams) ll2.getLayoutParams();
        params.topMargin = params.topMargin - (int)(miejsca.size() * getResources().getDimension(R.dimen.wielkosc_pola_listView_w_rozwijanym_menu));
        ll2.setLayoutParams(params);
            rozsuniety = true;
        }
    }

    private void rozsunMenu(int odKtorego){
        Log.d(DEBUG_TAG, "Mam rozsunac od " + odKtorego);
        for (int i = przyciski.size()-1; i > odKtorego; i--) {
            Log.d(DEBUG_TAG,"Rozsuwam przycisk: " + i);
            przyciski.get(i).startAnimation(animacjaPrzesuniecieWDol);
        }

    }

    private void rozsunPonownieMenu(int odKtorego){
        Log.d(DEBUG_TAG, "Mam rozsunac ponownie od " + odKtorego);
        Thread t = new Thread(){
            public void run(){
                try {
                    Thread.sleep(1000);
                    wiadomosc = new Message();

                    // Dodajemy treść, używamy jednego z dostępnych pól w Message
                    wiadomosc.arg1 = 1;
                    handler.sendMessage(wiadomosc);
                } catch (InterruptedException e) { e.printStackTrace();}
            }
        };
        t.start();

    }

    private void zasunMenu(int odKtorego){
        Log.d(DEBUG_TAG, "Mam zasunac od " + odKtorego);
        for (int i = przyciski.size()-1; i > odKtorego; i--) {
            Log.d(DEBUG_TAG,"Zasuwam przycisk: " + i);
            przyciski.get(i).startAnimation(animacjaPrzesuniecieWGore);
        }
    }

    private void tworzAnimacje(int odleglosc, int czasTrwaniaAnimacji) {
    	animacjaPrzesuniecieWDol = new TranslateAnimation(0,0,0,odleglosc);
    	animacjaPrzesuniecieWDol.setDuration(czasTrwaniaAnimacji);
    	animacjaPrzesuniecieWDol.setInterpolator(new BounceInterpolator());
    	animacjaPrzesuniecieWDol.setAnimationListener(new MyAnimationListener(false));
//        animacjaPrzesuniecieWDol.setFillAfter(true);

    	animacjaPrzesuniecieWGore = new TranslateAnimation(0,0,0,-odleglosc);
    	animacjaPrzesuniecieWGore.setDuration(czasTrwaniaAnimacji);
    	animacjaPrzesuniecieWGore.setInterpolator(new BounceInterpolator());
    	animacjaPrzesuniecieWGore.setAnimationListener(new MyAnimationListener(true));
//        animacjaPrzesuniecieWGore.setFillAfter(true);


    }

//-----------------------------------------------------------------------------
    public class MyAnimationListener implements Animation.AnimationListener {

    	private boolean wGore;

    	public MyAnimationListener(boolean wGore) {
    		this.wGore = wGore;
    	}

        @Override
        public void onAnimationStart(Animation animation) {
            czyWolnoKlikac = false;
        }

		@Override
		public void onAnimationEnd(Animation animation) {
            if(wGore) {
                przyciski.get(poprzednioKlikniety+1).clearAnimation();
                przyciski.get(poprzednioKlikniety).clearAnimation();
                llparams = (LinearLayout.LayoutParams)przyciski.get(poprzednioKlikniety+1).getLayoutParams(); //pobranie paramterów ll granicznego
                llparams.topMargin = llparams.topMargin-(int)(iloscMiejsc * getResources().getDimension(R.dimen.wielkosc_pola_listView_w_rozwijanym_menu)); //zmiana parametrów w zależności od potrzeby
                przyciski.get(poprzednioKlikniety+1).setLayoutParams(llparams);   // przypisane nowych parametrów do l
                ukryjZawartosc(przyciski.get(poprzednioKlikniety));
            }else{
                przyciski.get(aktualnieKlikniety+1).clearAnimation();
                przyciski.get(aktualnieKlikniety).clearAnimation();
                llparams = (LinearLayout.LayoutParams)przyciski.get(aktualnieKlikniety+1).getLayoutParams(); //pobranie paramterów ll granicznego
                llparams.topMargin = llparams.topMargin+(int)(iloscMiejsc * getResources().getDimension(R.dimen.wielkosc_pola_listView_w_rozwijanym_menu)); //zmiana parametrów w zależności od potrzeby
                przyciski.get(aktualnieKlikniety+1).setLayoutParams(llparams);   // przypisane nowych parametrów do l
            }
            czyWolnoKlikac=true;
		}


		@Override
		public void onAnimationRepeat(Animation animation) {}


    }

//    ----------------------------------------------------------------
    /**
     * Dostosowanie wyglądu fontów
     */
    private void dostosujFonty(){
        Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/pwr1.ttf");
        TextView tv = (TextView) findViewById(R.id.tv_w1);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w1_opis);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w2);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w2_opis);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w3);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w3_opis);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w4);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w4_opis);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w5);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w5_opis);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w6);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w6_opis);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w7);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w7_opis);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w8);
        tv.setTypeface(tf);
        tv = (TextView) findViewById(R.id.tv_w8_opis);
        tv.setTypeface(tf);



    }
}
